<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="jquery.js" charset="utf-8"></script> <!-- 引入jquery插件 -->
    <script>
    //es6中new Promise() 作用把异步操作改成同步执行
    //   console.dir(Promise) //可查看对象上的所有属性与方法
/*   //一.Promise基础用法 
      let p=new Promise((resolve,reject)=>{
		  //内部放异步请求的内容 ajax ,成功的通过resolve回调出去,失败的通过reject回调出去
		//   resolve('成功了')  //状态由pending变为fulfilled
		  reject('失败了啊') //状态由pending变为rejected
	  })
	  //then里面是方法，代表请求成功或失败执行的回调
	  //方法1
	//   console.log('18三种状态',p) //promise返回的是一个对象
	//  p.then((res)=>{ //成功回调
	// 	  console.log(20,res)
	//   },(err)=>{ //失败回调
	// 	  console.log(22,err)
	//   }) 
	   
	 //方法2
	 p.then((res)=>{ //成功回调
	 		  console.log('成功回调',res)
	 }).catch((err)=>{ //失败回调
	 		  console.log('失败回调',err)
	 }).finally(()=>{
		 console.log('不管成功与失败都会执行');
	 })  */
	   
// 二.Promise内部要的是异步请求结果，ajax,定时器等-实际运用用它封装网络请求$.ajax(),wx.request()
/*    let p= new Promise((resolve,reject)=>{
           $.ajax({
               url:'data/1.json',
            //    method:'get',  //post
            //    data:{},
               success:function(res){
                //   console.log(41,res);
                  resolve(res)
               },
               error:function(err){
                // console.log(45,err);
                reject(err)
               },
           })
    }) 

    p.then((res)=>{
         console.log(52,res);
    }).catch((err)=>{
         console.log(54,err);
    }).finally(()=>{
        console.log('不管成功与失败都会执行');
    }) */

// 三.Promise封装-axios原理

function getAxios(url){
   return new Promise((resolve,reject)=>{
           $.ajax({
               url:url, //接口路径
            //    method:'get',  //post
            //    data:{},
               success:function(res){
                //   console.log(41,res);
                  resolve(res)
               },
               error:function(err){
                // console.log(45,err);
                reject(err)
               },
           })
    }) 
}


//调用promise
// getAxios('data/1.json').then(res=>{
//     console.log(81,res);
// })


//用promise如何解决多层回调地狱问题?
//解决方法1-请求多个结果，在内层判断
// let data1=getAxios('data/1.json') 
// let data2=getAxios('data/2.json') 
  
// data1.then(res=>{
//     console.log('81第1个结果',res);
//     if(res){
//         data2.then(res1=>{
//            console.log('93第2个结果',res1);
//         })
//     }
// })

//解决方法2-promise中.then链式调用
//   getAxios('data/1.json')
//   .then(res=>{
//     console.log(101,res);
//     return getAxios('data/2.json')  //返回，以供下次调用
//   })
//   .then(res=>{
//     console.log(102,res);
//   })


// 四。promise其它api方法-多个接口都请求到Promise.all[promise1,promise2,...]返回数组。
  let p1=getAxios('data/1.json') 
  let p2=getAxios('data/2.json') 
   Promise.all([p1,p2]).then(res=>{
       console.log('all都执行',res);
       let [a,b]=res   //解构下
       console.log(a,b);
   }).catch(err=>{
       console.log("失败了");
   })


/* 	总结：什么是promise？
  解决地狱回调问题
  它可以进行链式调用
  有三种状态分别是 ：pending 初始状态,进行中 fulfilled 成功状态，请求成功了 rejected 失败状态，请求失败了  Promise的状态一旦改变，就不会再变，任何时候都可以得到这个结果，状态不可以逆，只能由 pending变成fulfilled或者由pending变成rejected。
  promise有哪些API方法：.then(),.catch(),.finally()，.all(),.race()
  应用场景：封装ajax,axios的get,post封装，微信小程序中封装wx.request()，uniapp开发中uni.request() */


    </script>
  </head>
  <body>

  </body>
</html>
